package top.syfy.bili.fbm.util;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.util.Objects;
import java.util.Properties;

/**
 * 缓存视频的配置文件读取工具类
 *
 * @author awg
 * @date 2020/10/19 星期一
 */
public class DescPropertiesUtil {

    /**
     * 配置文件输入流
     */
    private static InputStream propertyInputStream = null;

    /**
     * 从配置文件中根据给定的属性名获取属性值
     *
     * @param key 属性名
     * @return 属性名对应的属性值
     * @throws IOException IO异常
     */
    public static String getProperty(String key) throws IOException {
        Properties properties = new Properties();
        if (Objects.isNull(propertyInputStream)) {
            propertyInputStream = DescPropertiesUtil.class.getClassLoader().getResourceAsStream("bilicachevideo.properties");
            if (Objects.nonNull(propertyInputStream)){
                //实现对InputStream重复读取-标记要回朔的流的位置
                propertyInputStream.mark(0);
            }
        }
        properties.load(propertyInputStream);
        Object value = properties.get(key);
        //实现对InputStream重复读取-回退到标记位置的缓存
        propertyInputStream.reset();
        return Objects.isNull(value) ? "" : String.valueOf(value);
    }

    /**
     * 将新的属性值(批量)存储到配置文件中(此方式会将配置文件中的内容全部清空再写入，会丢失原本的注释)
     *
     * @param propertyNameAndNewValue biliblicachevideo.properties文中键名数组 和 要设置的新值的数组 组成的二维数组
     * @throws IOException IO异常
     */
    public static void setProperty(String[][] propertyNameAndNewValue) throws IOException {
        if (ArrayUtils.isEmpty(propertyNameAndNewValue) || !ArrayUtils.isSameLength(propertyNameAndNewValue[0], propertyNameAndNewValue[1])) {
            throw new IllegalArgumentException("参数异常：缺少必要的参数或者参数包含的元素的数量不匹配");
        }
        Properties properties = new Properties();
        if (Objects.isNull(propertyInputStream)) {
            propertyInputStream = DescPropertiesUtil.class.getClassLoader().getResourceAsStream("bilicachevideo.properties");
        }
        properties.load(propertyInputStream);
        //一定要在load之后再进行输出
        //为避免每次使用同一个输入流而造成的存储时内容重复，所以每次都要使用新的输出流
        OutputStream propertyOutputStream = new FileOutputStream(new File("src/main/resources/bilicachevideo.properties"));
        for (int i = 0; i < propertyNameAndNewValue[0].length; i++) {
            //判断属性值是否已修改，若是已修改则进行修改
            if (!StringUtils.equals(getProperty(propertyNameAndNewValue[0][i]), propertyNameAndNewValue[1][i])) {
                properties.setProperty(propertyNameAndNewValue[0][i], propertyNameAndNewValue[1][i]);
            }
        }
        properties.store(propertyOutputStream, null);
    }

    /**
     * 关闭流
     *
     * @throws IOException IO异常
     */
    public static synchronized void closeStream() throws IOException {
        if (Objects.nonNull(propertyInputStream)) {
            //关闭输入流
            propertyInputStream.close();
        }
    }

}
